package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.gov.medellin.ssti.sub.common.util.CondicionConsultaUtilVO;
import co.gov.medellin.ssti.sub.common.util.FiltrosReportesUtil;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.service.EmpresaService;
import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.EmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.web.form.RepDetEmpresaForm;

@Component
public class SelectCriteriaDetEmpresaAction extends Action {
	@Autowired
	EmpresaService empresaServiceImpl;
	@Autowired
	FiltrosReportesUtil filtrosReportesUtil;

	private static final Logger logger = Logger
			.getLogger(SelectCriteriaDetEmpresaAction.class);

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		HttpSession session = request.getSession();
		Collection<CondicionConsultaVO> filters = (Collection<CondicionConsultaVO>) session
				.getAttribute("filtrosRepDetEmpresa");

		session.removeAttribute("beneficiosRepDetEmpresa");
		session.removeAttribute("lEspecificosRepDetEmpresa");

		RepDetEmpresaForm formBean = (RepDetEmpresaForm) form;
		RepEmpresaVO repEmpresaVO = new RepEmpresaVO();

		if (filters != null) {
			formBean.setFiltros(filters);
		}

		session.setAttribute("filtrosRepDetEmpresa", formBean.getFiltros());

		Collection<EmpresaVO> empresas = new ArrayList<EmpresaVO>();
		Collection<ProgramaVO> programas = new ArrayList<ProgramaVO>();
		Collection<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		Collection<String> actividadesEconomicas = new ArrayList<String>();

		actividadesEconomicas = empresaServiceImpl.findActividadesEconomicas();
		String actividadEconomica = formBean.getRepEmpresaVO()
				.getActividadEconomica();
		if (actividadesEconomicas != null && !actividadesEconomicas.isEmpty()) {
			formBean.setActividadesEconomicas(actividadesEconomicas);
		}

		if (actividadEconomica != null && !actividadEconomica.isEmpty()) {
			empresas = empresaServiceImpl
					.findEmpresasByActividadEconomica(actividadEconomica);
		} else {
			empresas = empresaServiceImpl.findAllEmpresas();
		}

		if (empresas != null && !empresas.isEmpty()) {
			formBean.setEmpresas(empresas);
		}

		EmpresaVO criteria = new EmpresaVO();
		criteria.setRazonSocial(actividadEconomica);
		String codeEmpresaStr = formBean.getRepEmpresaVO().getCodeEmpresaStr();

		try {
			criteria.setCodigo(new Long(codeEmpresaStr));
		} catch (Exception e) {
		}

		programas = empresaServiceImpl
				.findProgramasEntregadosByCriteria(criteria);

		if (programas != null && !programas.isEmpty()) {
			formBean.setProgramas(programas);
		}
		if (formBean.getRepEmpresaVO().getCodeEmpresaStr() != null
				&& !formBean.getRepEmpresaVO().getCodeEmpresaStr().equals("")) {
			// buscar nombre de la empresa
			for (EmpresaVO vo : empresas) {
				if (formBean.getRepEmpresaVO().getCodeEmpresaStr()
						.equals(Long.toString(vo.getCodigo()))) {
					formBean.getRepEmpresaVO().setNombreEmpresa(
							vo.getRazonSocial());
				}
			}
		}
		if (formBean.getRepEmpresaVO().getCodeProgramaStr() != null
				&& !formBean.getRepEmpresaVO().getCodeProgramaStr().equals("")) {
			// buscar nombre programa.
			for (ProgramaVO vo : programas) {
				if (formBean.getRepEmpresaVO().getCodeProgramaStr()
						.equals(Long.toString(vo.getCode()))) {
					formBean.getRepEmpresaVO()
							.setNombrePrograma(vo.getNombre());
				}
			}
		}
		if (formBean.getRepEmpresaVO().getCodeProgramaStr() != null
				&& !formBean.getRepEmpresaVO().getCodeProgramaStr().equals("")) {
			subprogramas = empresaServiceImpl.findSubprogramasEntregados(Long
					.valueOf(formBean.getRepEmpresaVO().getCodeProgramaStr()));
			if (subprogramas != null && !subprogramas.isEmpty()) {
				formBean.setSubprogramas(subprogramas);
			}
			if (formBean.getRepEmpresaVO().getCodeSubprogramaStr() != null
					&& !formBean.getRepEmpresaVO().getCodeSubprogramaStr()
							.equals("")) {
				// buscar nombre subprograma.
				for (SubprogramaVO vo : subprogramas) {
					if (formBean.getRepEmpresaVO().getCodeSubprogramaStr()
							.equals(Long.toString(vo.getCode()))) {
						formBean.getRepEmpresaVO().setNombreSubprograma(
								vo.getNombre());
					}
				}
			}
		}

		// Filtros.
		// Operacion seleccionar un atributo (parametro)
		if (formBean.getOperacion()
				.equalsIgnoreCase(Utility.OP_SELECT_ATRIBUTO)) {
			if (!formBean.getCodeAtributo().equals("")) {
				try {
					CondicionConsultaUtilVO condicionConsultaUtilVO = filtrosReportesUtil
							.obtainCondicionConsulta(formBean.getCodeAtributo());
					// Collection CondicionConsultaVO
					Collection<CondicionConsultaVO> operadores = condicionConsultaUtilVO
							.getOperadores();
					Collection<CondicionConsultaVO> valores1 = condicionConsultaUtilVO
							.getValores1();

					formBean.setOperadores(operadores);
					if (valores1 != null && !valores1.isEmpty()) {
						formBean.setValores1(valores1);
					} else {
						formBean.setValores1(null);
					}

					formBean.setValores2(null);
					formBean.setTipoCampo(condicionConsultaUtilVO
							.getTipoCampo());
					logger.info("tipocampo " + formBean.getTipoCampo());
				} catch (Exception e) {
					logger.error(e);
				}
			}
		}

		// operacion agregar filtro
		if (formBean.getOperacion().equalsIgnoreCase(Utility.OP_ADD_FILTRO)) {
			CondicionConsultaVO condicionConsultaVO = new CondicionConsultaVO();
			condicionConsultaVO.setCodigo(formBean.getCodeAtributo());
			condicionConsultaVO.setCodcampo(formBean.getCodeAtributo());
			condicionConsultaVO.setCampo(formBean.getEtiquetaAtributo());
			condicionConsultaVO.setTipoCampo(formBean.getTipoCampo());
			condicionConsultaVO.setCodFiltro(formBean.getCodeOperador());
			condicionConsultaVO.setFiltro(formBean.getEtiquetaOperador());
			if (formBean.getEtiquetaValor1() != null
					&& !formBean.getEtiquetaValor1().equals("")) {
				condicionConsultaVO.setEtiquetaValor(formBean
						.getEtiquetaValor1());
				condicionConsultaVO.setValor(formBean.getValor1());
			} else {
				condicionConsultaVO.setEtiquetaValor(formBean.getValor1());
				condicionConsultaVO.setValor(formBean.getValor1());
			}
			// System.out.println(condicionConsultaVO.getEtiquetaValor());
			condicionConsultaVO.setEtiquetaValor2(formBean.getValor2());
			condicionConsultaVO.setValor2(formBean.getValor2());

			// formBean.getFiltros().add(condicionConsultaVO);

			formBean.setCodeAtributo("");

			if (filters != null) {
				filters.add(condicionConsultaVO);
				formBean.setFiltros(filters);
			} else {
				Collection<CondicionConsultaVO> col = new ArrayList<CondicionConsultaVO>();
				col.add(condicionConsultaVO);
				session.setAttribute("filtrosRepDetEmpresa", col);
				formBean.setFiltros(col);
			}

			formBean.setValor1("");

		}
		// operacion eliminar filtro
		if (formBean.getOperacion().equalsIgnoreCase(Utility.OP_DELETE_FILTRO)) {
			Collection<CondicionConsultaVO> filtros = formBean.getFiltros();

			int index = formBean.getIndexFilter();
			int count = 1;
			Iterator<CondicionConsultaVO> it = filtros.iterator();
			while (it.hasNext()) {
				it.next();
				if (index == count) {
					it.remove();
					break;
				} else {
					count++;
				}
			}
		}

		// buscar
		if (formBean.getOperacion() != null
				&& formBean.getOperacion().equals(Utility.OP_BUSCAR)) {
			// criterios elegidos
			String codeProgramaStr = formBean.getRepEmpresaVO()
					.getCodeProgramaStr();
			String codeSubprogramaStr = formBean.getRepEmpresaVO()
					.getCodeSubprogramaStr();
			String fechaIni = formBean.getRepEmpresaVO().getDesde();
			String fechaFin = formBean.getRepEmpresaVO().getHasta();
			if (codeProgramaStr != null && !codeProgramaStr.isEmpty()) {
				repEmpresaVO.setCodePrograma(Long.valueOf(codeProgramaStr));
			}
			if (codeSubprogramaStr != null && !codeSubprogramaStr.isEmpty()) {
				repEmpresaVO.setCodeSubprograma(Long
						.valueOf(codeSubprogramaStr));
			}
			if (fechaIni != null && !fechaIni.isEmpty()) {
				repEmpresaVO.setDesde(fechaIni);
			}
			if (fechaFin != null && !fechaFin.isEmpty()) {
				repEmpresaVO.setHasta(fechaFin);
			}
			if (actividadEconomica != null && !actividadEconomica.isEmpty()) {
				repEmpresaVO.setActividadEconomica(actividadEconomica);
			}
			if (codeEmpresaStr != null && !codeEmpresaStr.isEmpty()) {
				try {
					repEmpresaVO.setCodeEmpresa(new Long(codeEmpresaStr));
				} catch (Exception e) {
				}
			}

			Collection<BeneficioOtorgadoEmpresaVO> beneficios = empresaServiceImpl
					.findResumenBeneficioOtorgadoDetByCriteria(repEmpresaVO);

			if (beneficios == null || beneficios.isEmpty()) {
				formBean.getBeneficios().clear();
			}
			if (beneficios != null && !beneficios.isEmpty()) {
				formBean.setBeneficios(beneficios);
			}
			session.setAttribute("resumenBeneficiosRepDetEmpresa",
					formBean.getBeneficios());
			// criteria
			session.setAttribute("criteriaRepDetEmpresa", repEmpresaVO);
			return mapping.findForward("success");
		}

		if (formBean.getOperacion() != null
				&& formBean.getOperacion().equals(Utility.OP_GENERAR_REPORTE)
				&& formBean.getGenerar() != null
				&& !(formBean.getGenerar().isEmpty())) {
			ActionForward actionRedirect = new ActionForward(mapping
					.findForward("ir").getName(), mapping.findForward("ir")
					.getPath() + "?generar=" + formBean.getGenerar(), true);

			return actionRedirect;
		}

		return mapping.findForward("success");
	}
}
